package com.hhs.FileUpload.service.impl;

import com.hhs.FileUpload.service.JiahunService;
import com.hhs.FileUpload.util.Result;
import com.ruibty.nsfw.NsfwService;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ContentDisposition;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.UUID;

@Service
public class JianhuanServiceImpl implements JiahunService {

    @Value("${file.upload}")
    private String FRAME_OUTPUT_DIR;



    @Autowired
    private NsfwService nsfwService;

    @Override
    public boolean jianhuan(MultipartFile multipartFile) {
        // 首先，将MultipartFile保存到服务器的某个位置
        File tempFile = saveMultipartFile(multipartFile);
        boolean isAnyFramePornographic = false;
        boolean isYellow = false;
        if (tempFile == null) {
            return false;
        }

        File file = new File(FRAME_OUTPUT_DIR);
        // 上传的文件夹不存在就重新创建一个
        if(!file.exists()){
            file.mkdirs();
        }
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(tempFile.getAbsolutePath());
        try {
            grabber.start();
            int frameIndex = 0;
            Frame frame;

            while ((frame = grabber.grabFrame()) != null) {
                if (frameIndex % 200 == 0) {
                    Java2DFrameConverter converter = new Java2DFrameConverter();
                    BufferedImage bufferedImage = converter.convert(frame);

                    // 鉴定图片是不是黄色
                    boolean isPorn = isPornographic(bufferedImage);
                    if (isPorn) {
                        isAnyFramePornographic = true;
                        // System.out.println("Frame " + frameIndex + " is pornographic!");
                        // 获取当前的时间点并保存图片 方便后面进行人工审核
                        long timestamp = grabber.getTimestamp();// 微秒
                        // 转化为秒
                        long seconds = timestamp / 1000000;
                        System.out.println("注意：在视频的第" + seconds + "秒有违规现象。");
                        // 将违规的图片保存
                        String outputPath = FRAME_OUTPUT_DIR + "/frame_" + UUID.randomUUID() + timestamp + ".png";
                        System.out.println("文件的名字是："+outputPath);
                        ImageIO.write(bufferedImage, "png", new File(outputPath));
                        break;
                    }
                }
                frameIndex++;
            }
            grabber.stop(); // 停止FFmpegFrameGrabber

        } catch (Exception e) {
            e.printStackTrace();
        }


        return isAnyFramePornographic;
    }


    @Override
    public boolean tupian(MultipartFile file) {
        // 调用服务层方法获取预测值
        float prediction = 0;
        try {
            prediction = nsfwService.getPrediction(file.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }

        // boolean isYellow=prediction>0.34?true:false;
        // 不需要手动将float转换为BigDecimal来判断阈值，直接比较即可
        boolean isYellow = prediction > 0.34f;
        return isYellow;
    }

    private File saveMultipartFile(MultipartFile multipartFile) {
        // 这里只是一个示例，您需要根据实际情况调整保存的位置和文件名
        String fileName = multipartFile.getOriginalFilename();
        File dest = new File(System.getProperty("java.io.tmpdir"), fileName);
        try {
            multipartFile.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return dest;
    }


    // 这是一个假设的方法，你需要实现它或调用外部的API/服务

    private boolean isPornographic(BufferedImage image) throws IOException {
        // 假设你有一个nsfwService服务，它可以将BufferedImage转换为字节流或图像文件，并调用API进行预测
        // 这里只是一个示例，你需要根据你的实际情况来实现这部分逻辑
        byte[] imageBytes = convertImageToBytes(image); // 假设你有一个方法可以将BufferedImage转换为字节数组

        // 调用nsfwService的getPrediction方法来获取预测结果
        float prediction = nsfwService.getPrediction(imageBytes);

        // 直接使用float值进行比较来判断是否色情
        boolean isYellow = prediction > 0.34f;

        // 直接返回布尔值，而不是Result对象
        return isYellow;
    }

    // 你需要实现一个方法来将BufferedImage转换为字节数组
// 这可能涉及到将BufferedImage写入到ByteArrayOutputStream中
    private byte[] convertImageToBytes(BufferedImage image) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "png", baos); // 或者其他合适的格式，如"png"
        return baos.toByteArray();
    }
}
